﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using LarDosIdosos.Business;
using LarDosIdosos.Business.Model;
using LarDosIdosos.Properties;

namespace LarDosIdosos.DataSources
{
    public class DataSourceEstoque
    {
        private static int total;

        /// <summary>
        /// Busca os produtos no banco de acordo com o Codigo_Tipo_Produto
        /// </summary>
        /// <param name="startrowindex"></param>
        /// <param name="maximumrows"></param>
        /// <param name="sortexpression"></param>
        /// <param name="Codigo_Tipo_Produto"></param>
        /// <returns></returns>
        public List<Estoque> BuscaEstoque(int startrowindex, int maximumrows, string sortexpression, object Codigo_Tipo_Produto)
        {
            //Seleciona as entradas dos produtos pelo tipo
            string sqlEntrada = "select * from entrada_produto, produto, tipo_produto, unidade_de_medida where entrada_produto.produto_codigo_produto = produto.codigo_produto and produto.tipo_produto_codigo_tipo_produto = tipo_produto.codigo_tipo_produto and produto.unidade_de_medida_codigo_unidade_de_medida = unidade_de_medida.codigo_unidade_de_medida and tipo_produto.codigo_tipo_produto = " + Codigo_Tipo_Produto;
            DBEstoque dbEstoque = new DBEstoque(Settings.Default.StringDeConexaoComBanco);
            List<EntradaProduto> listEntrada = dbEstoque.SelectEntradaList(sqlEntrada);
            //===========================================

            //Seleciona as saídas dos produtos pelo tipo
            string sqlSaida = "select * from saida_produto, produto, tipo_produto, unidade_de_medida where saida_produto.produto_codigo_produto = produto.codigo_produto and produto.tipo_produto_codigo_tipo_produto = tipo_produto.codigo_tipo_produto and produto.unidade_de_medida_codigo_unidade_de_medida = unidade_de_medida.codigo_unidade_de_medida and tipo_produto.codigo_tipo_produto = " + Codigo_Tipo_Produto;
            List<SaidaProduto> listSaida = dbEstoque.SelectSaidaList(sqlSaida);
            //==========================================


            //Mescla as entradas e soma as quantidades, é como um group
            List<Estoque> listEstoque = new List<Estoque>();
            foreach(var entrada in listEntrada)
            {
                listEstoque.Add(new Estoque{ produto = entrada.Produto, quantidade_estoque = entrada.Quantidade});
            }
            List<Estoque> listEstoque2 = new List<Estoque>();
            foreach (var entrada in listEntrada)
            {
                IEnumerable<Estoque> enumerableEstoque = from estoque in listEstoque
                                                    where
                                                        estoque.produto.Codigo_Produto == entrada.Produto.Codigo_Produto
                                                    select estoque;
                double quantidade = 0.0;
                foreach (var estoque in enumerableEstoque)
                {
                    quantidade += estoque.quantidade_estoque;
                }
                if (!listEstoque2.Exists(i => i.produto.Codigo_Produto == entrada.Produto.Codigo_Produto))
                {
                    listEstoque2.Add(new Estoque { produto = entrada.Produto, quantidade_estoque = quantidade });
                }
            }
            listEstoque = new List<Estoque>();
            foreach (var saida in listSaida)
            {
                listEstoque.Add(new Estoque { produto = saida.Produto, quantidade_estoque = saida.Quantidade });
            }
            List<Estoque> listEstoque3 = new List<Estoque>();
            foreach (var saida in listSaida)
            {
                IEnumerable<Estoque> enumerableEstoque = from estoque in listEstoque
                                                         where
                                                             estoque.produto.Codigo_Produto == saida.Produto.Codigo_Produto
                                                         select estoque;
                double quantidade = 0.0;
                foreach (var estoque in enumerableEstoque)
                {
                    quantidade += estoque.quantidade_estoque;
                }
                if (!listEstoque3.Exists(i => i.produto.Codigo_Produto == saida.Produto.Codigo_Produto))
                {
                    listEstoque3.Add(new Estoque { produto = saida.Produto, quantidade_estoque = quantidade });
                }
            }
            List<Estoque> listaDeEstoque = new List<Estoque>();
            foreach (var estoque2 in listEstoque2)
            {
                foreach (var estoque3 in listEstoque3)
                {
                    if(estoque2.produto.Codigo_Produto == estoque3.produto.Codigo_Produto)
                    {
                        estoque2.quantidade_estoque = estoque2.quantidade_estoque - estoque3.quantidade_estoque;
                    }
                }
                listaDeEstoque.Add(estoque2);
            }
            //========================

            //Salva o total na variável statica
            total = listaDeEstoque.Count;
            //=================================

            return listaDeEstoque;
        }

        public int TotalDeEstoque(object Codigo_Tipo_Produto)
        {
            return total;
        }
    }
}